from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List, Optional

mcp = FastMCP("DDE App Services MCP Server")

"""
面向 dde-app-services 软件的 MCP Server

提供的 MCP tools：
1. dde_dconfig_daemon_help - 查询 dde-dconfig-daemon 帮助信息
   - 参数：help_type (str): 帮助类型，可选值："-h", "--help", "--help-all"
   - 返回：统一 JSON 结构

2. dde_dconfig_daemon_run - 运行 dde-dconfig-daemon 命令
   - 参数：timeout (Optional[int]): 超时时间，prefix (Optional[str]): 前缀路径，exit_code (Optional[int]): 退出码
   - 返回：统一 JSON 结构

3. dde_dconfig_help - 查询 dde-dconfig 帮助信息
   - 参数：help_type (str): 帮助类型，可选值："-h", "--help", "--help-all"
   - 返回：统一 JSON 结构

4. dde_dconfig_list - 列出配置信息
   - 参数：无
   - 返回：统一 JSON 结构

5. dde_dconfig_get - 获取配置项值
   - 参数：app_id (str): 应用ID，resource (str): 资源名，subpath (str): 子路径，key (str): 键名
   - 返回：统一 JSON 结构

6. dde_dconfig_set - 设置配置项值
   - 参数：app_id (str): 应用ID，resource (str): 资源名，subpath (str): 子路径，key (str): 键名，value (str): 值
   - 返回：统一 JSON 结构

7. dde_dconfig_reset - 重置配置项
   - 参数：app_id (str): 应用ID，resource (str): 资源名，subpath (str): 子路径，key (str): 键名
   - 返回：统一 JSON 结构

8. dde_dconfig_watch - 监视配置项变化
   - 参数：app_id (str): 应用ID，resource (str): 资源名，subpath (str): 子路径，key (str): 键名
   - 返回：统一 JSON 结构

9. dde_dconfig_gui - 启动图形界面工具
   - 参数：无
   - 返回：统一 JSON 结构

所有 MCP tool 返回的统一 JSON 结构：
{
  "success": bool,
  "command": str,
  "exit_code": int,
  "stdout": str,
  "stderr": str
}
"""

@mcp.tool()
def dde_dconfig_daemon_help(help_type: str) -> dict:
    """
    查询 dde-dconfig-daemon 命令的帮助信息
    
    参数:
        help_type: 帮助类型，可选值："-h"、"--help"、"--help-all"
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    cmd = ["dde-dconfig-daemon", help_type]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_daemon_run(timeout: Optional[int] = None, prefix: Optional[str] = None, exit_code: Optional[int] = None) -> dict:
    """
    运行 dde-dconfig-daemon 命令，支持多种参数组合
    
    参数:
        timeout: 超时时间（秒）
        prefix: 前缀路径
        exit_code: 退出码
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    cmd = ["dde-dconfig-daemon"]
    
    if timeout is not None:
        cmd.extend(["-t", str(timeout)])
    
    if prefix is not None:
        cmd.extend(["-p", prefix])
    
    if exit_code is not None:
        cmd.extend(["-e", str(exit_code)])
    
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_help(help_type: str) -> dict:
    """
    查询 dde-dconfig 命令的帮助信息
    
    参数:
        help_type: 帮助类型，可选值："-h"、"--help"、"--help-all"
    
    返回:
        统一 JSON 结构，包含命令执行结果
    """
    cmd = ["dde-dconfig", help_type]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_list() -> dict:
    """
    列出所有配置信息
    
    返回:
        统一 JSON 结构，包含配置列表信息
    """
    cmd = ["dde-dconfig", "--list"]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_get(app_id: str, resource: str, subpath: str, key: str) -> dict:
    """
    获取指定配置项的值
    
    参数:
        app_id: 应用ID（如：org.deepin.dde.control-center）
        resource: 资源名
        subpath: 子路径
        key: 键名
    
    返回:
        统一 JSON 结构，包含配置项值
    """
    cmd = ["dde-dconfig", "--get", "-a", app_id, "-r", resource, "-s", subpath, "-k", key]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_set(app_id: str, resource: str, subpath: str, key: str, value: str) -> dict:
    """
    设置配置项的值
    
    参数:
        app_id: 应用ID（如：org.deepin.dde.control-center）
        resource: 资源名
        subpath: 子路径
        key: 键名
        value: 要设置的值
    
    返回:
        统一 JSON 结构，包含设置结果
    """
    cmd = ["dde-dconfig", "--set", "-a", app_id, "-r", resource, "-s", subpath, "-k", key, "-v", value]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_reset(app_id: str, resource: str, subpath: str, key: str) -> dict:
    """
    重置配置项到默认值
    
    参数:
        app_id: 应用ID（如：org.deepin.dde.control-center）
        resource: 资源名
        subpath: 子路径
        key: 键名
    
    返回:
        统一 JSON 结构，包含重置结果
    """
    cmd = ["dde-dconfig", "--reset", "-a", app_id, "-r", resource, "-s", subpath, "-k", key]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_watch(app_id: str, resource: str, subpath: str, key: str) -> dict:
    """
    监视配置项的变化
    
    参数:
        app_id: 应用ID（如：org.deepin.dde.control-center）
        resource: 资源名
        subpath: 子路径
        key: 键名
    
    返回:
        统一 JSON 结构，包含监视结果
    """
    cmd = ["dde-dconfig", "--watch", "-a", app_id, "-r", resource, "-s", subpath, "-k", key]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def dde_dconfig_gui() -> dict:
    """
    启动 dde-dconfig 图形界面工具
    
    返回:
        统一 JSON 结构，包含图形界面启动结果
    """
    cmd = ["dde-dconfig", "--gui"]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(cmd),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

if __name__ == "__main__":
    mcp.run()